/* 
@首页
*/
const express = require('express')
const router = express()
const multer = require('multer')
const { url } = require('../upload/index')
const Minio = require('minio')
const fs = require('fs')
const { status200, status500 } = require('../util/status')
const { addPdfLib } = require('./tool/tool')
const storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, url);
    },
    filename: (req, file, cb) => {
        cb(null, file.originalname)
    }
});
const upload = multer({ storage: storage });
router.use(express.json())
const { logger } = require('../util/log')
const { raSend, receFun } = require('../util/ampq')
const { fun, createCode } = require('../home/api/index')
const { PDFDocument } = require('pdf-lib');
/* 
获取首页
*/

router.get('/home/getPrompt/:id', (req, res) => {
    const { id } = req.params
    if (id == '1234567890') {
        res.send({
            code: 200,
            msg: 'success',
            data: {
                username: '系统管理员'
            }
        })
    }
    else {
        res.send({
            code: 200,
            msg: 'success',
            data: {
                username: '普通成员'
            }
        })
    }
})

/* 
配置上传
*/

router.post('/home/upload', upload.single('file'), (req, res) => {
    if (req.file) {
        res.send({
            code: 200,
            msg: 'success',
            data: {
                url: `http://127.0.0.1:9066/${req.file.originalname}`
            }
        })
    }
})


/* 多选 */
router.post('/home/moreUpload', upload.array('file'), (req, res) => {
    console.log(req, 'req')
})



/* 配置minio存储 */

const minioClient = new Minio.Client({
    endPoint: '127.0.0.1',// 服务器的地址
    port: 9005,// 端口
    useSSL: false,// 是否使用 SSL 加密连接
    accessKey: 'minioadmin',
    secretKey: 'minioadmin'
})


const policy = {
    Version: '2012-10-17',// 策略语法的版本
    Statement: [
        {
            Effect: 'Allow',// 指定声明的效果 Allow表示允许指定的操作。
            Principal: { AWS: ['*'] },// 指定被授权的主体 { AWS: ['*'] }，表示所有 AWS 用户（包括匿名用户）。
            Action: ['s3:GetObject'],// 指定允许的操作 ['s3:GetObject']，表示允许获取对象（读取操作）。
            Resource: ['arn:aws:s3:::wangs/*']// 指定受策略影响的资源 ['arn:aws:s3:::mybucket/*']，表示 mybucket 存储桶中的所有对象。
        }
    ]
}

minioClient.setBucketPolicy('wangs', JSON.stringify(policy), function (err) {
    if (err) return console.log(err)
    console.log('Bucket policy set successfully.')
})


/* 判断是图片类型还是文件类型 图片则存在本地 文件则存在minio */


const isImage = (filename) => {
    let img = /(\jpg|\jpeg|\png|\gif|\webp)$/i
    if (img.test(filename)) {
        return Promise.resolve(true)
    }
    elseP
    return Promise.resolve(false)
}



router.post('/home/minioUpload', upload.single('file'), async (req, res) => {
    if (req.file) {
        /* minio存储操作 */
        let storageURL = url + '/' + req.file.originalname
        let isImg = await isImage(req.file.originalname)
        if (!isImg) {
            minioClient.fPutObject('wangs', req.file.filename, storageURL, (err, etag) => {
                if (err) return console.log(err)
                /* 删除 minio 存储在upload中的文件 */
                if (etag) {
                    fs.unlink(storageURL, (err) => {
                        if (err) {
                            res.status(500)
                            return
                        }
                        status200(res, { msg: 'success' })
                    })
                }
            })
            return
        }
        status200(res, { msg: 'success' })
    }
})


router.get('/home/getDownURL', (req, res) => {
    status200(res, { data: { url: 'http://127.0.0.1:9066/andong.png' } })
    // minioClient.listBuckets(function (err, buckets) {
    //     if (err) {
    //         res.status(500)
    //     }
    //     /* 列出桶中的对象 */
    //     const stream = minioClient.listObjects('wangs', '', true)
    //     stream.on('data', async function (obj) {
    //         console.log(obj, '999')
    //         // 默认第一个
    //         if (obj.name == 'andong.png') {
    //             const presignedUrl = await minioClient.presignedGetObject('wangs', obj.name, 300);
    //             status200(res, { msg: 'success', data: { url: presignedUrl } })
    //         }

    //     })
    //     stream.on('error', function (err) {
    //         res.status(500)
    //     })
    // })
})




/* pdf文件生成水印 */
router.post('/home/postcreatePdf', async (req, res) => {
    const data = await addPdfLib(req.body.pdfList)
    if (data) {
        status200(res, {
            data: {
                list: req.body.pdfList.concat([{ url: 'http://127.0.0.1:9066/test300.pdf', name: 'test300' }])
            }
        })
    }
})



/* 测试搭建日志管理 */

router.post('/home/checkDaily', (req, res) => {
    /* 假设参数test没有基于错误提示 */
    if (!req.body.test) {
        status500(res, { msg: 'test 参数找不到' })
        logger.error('/home/checkDaily/:test 参数找不到')
        return
    }
    status200(res, { msg: 'success' })

})


/* rabbitmq 消息队列  场景假设处理上传时带数据,处理完数据库数据 需要异步执行保存文件或者写入时不需要等待,让rabbitmq去完成,直接返回信息即可 */
router.post('/home/postBaseDataAndFile', async (req, res) => {
    let connectRes = await raSend()
    //发送消息成功等着接收消息然后做处理
    if (connectRes) {
        await receFun(fun, req)
        status200(res, { msg: 'success' })
        return
    }
    status500(res, { msg: 'error' })
})

/* 合并pdf 目前两个合并 多个合并在开发....*/

const mergeThods = (el) => {
    return new Promise(async (resolve, reject) => {
        const data = await fs.readFileSync(`${url}/${el.name}.pdf`)
        resolve(data)
    })
}


router.post('/home/mergeToPdf', async (req, res) => {
    // const pdfDoc = await PDFDocument.create();
    // const url1 = url + `/${req.body['pdfList'][0]['name']}.pdf`
    // const url2 = url + `/${req.body['pdfList'][1]['name']}.pdf`
    // const file1 = fs.readFileSync(url1)
    // const file2 = fs.readFileSync(url2)
    // const firstPdf = await PDFDocument.load(file1);
    // const secondPdf = await PDFDocument.load(file2);
    // const copiedPages1 = await pdfDoc.copyPages(firstPdf, firstPdf.getPageIndices());
    // copiedPages1.forEach(page => pdfDoc.addPage(page));
    // const copiedPages2 = await pdfDoc.copyPages(secondPdf, secondPdf.getPageIndices());
    // copiedPages2.forEach(page => pdfDoc.addPage(page));
    // const mergedPdfBytes = await pdfDoc.save();
    // fs.writeFileSync(url+'/test400.pdf', mergedPdfBytes);

    /* 使用promise.all 来处理循环异步操作*/
    const data = await Promise.all(req.body['pdfList'].map(async (el) => { return await mergeThods(el) }))
    const pdfDoc = await PDFDocument.create();
    for (let i = 0; i < data.length; i++) {
        const pdfBytes = data[i];
        const pdf = await PDFDocument.load(pdfBytes);
        const copiedPages = await pdfDoc.copyPages(pdf, pdf.getPageIndices());
        copiedPages.forEach(page => pdfDoc.addPage(page));
    }
    const pdfBytes = await pdfDoc.save();
    fs.writeFileSync(url + '/test400.pdf', pdfBytes)
    status200(res, { msg: 'success', data: { url: 'http://127.0.0.1:9066/test400.pdf' } })
})


/* 
@生成二维码返给前端 二维码信息暂时是个网页
*/

router.post('/api/createCodeToPDF', async (req, res) => {
    await createCode(res)
})





module.exports = router